第14章 服务器

Huan Lee Lv5

Rdis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。

14.1 命令请求的执行过程

一条客户端命令如SET KEY VALUE命令从发送到收到回复共有4个步骤

  1. 发送命令请求: 用户输入的命令转换成协议, 然后发送给服务器

  2. 读取命令请求: 服务器上的连接socket可读事件就绪, 通过命令请求处理器读取套接字中协议格式的命令请求, 并保存到输入缓冲区, 再解析协议把参数和个数保存到argv, argc, 最后调用命令执行器执行.

  3. 查找命令实现:

    1. 根据argv[0]在命令表中查找(命令不区分大小写)对应的命令, 并保存到客户端状态的cmd属性中

    2. 进行一系列的检查, 如cmd是否为NULL, 参数个数正确? 客户端是否通过了身份验证? 检查内存占用情况等等

    3. 执行命令

    4. 执行后续工作, 如添加日志? 写入到AOF缓冲区? 传播给从服务器?等等

  4. 将命令回复发送给客户端: 先保存到输出缓冲区, 等待socket写入事件就绪后进行发送. 客户端接收到回复后, 以可读形式打印.

14.2 serverCron函数

该函数默认每100ms执行一次, 负责管理服务器的资源.

  • 更新服务器的时间缓存
  • 更新LRU时钟
  • 更新服务器每秒执行命令次数
  • 更新服务器内存峰值记录
  • 处理SIGTERM信号
  • 管理客户端资源
  • 管理数据库资源
  • 执行被延迟的BGREWRITEAOF
  • 检查持久化操作的运行状态
  • 将AOF缓冲区中的内容写入AOF文件
  • 关闭异步客户端
  • 增加cronloops计数器的值

14.3 初始化服务器

  1. 初始化服务器状态结构: 设置运行ID, 运行频率, 运行架构, 默认配置文件, 端口号, 持久化条件, 初始化LRU时钟, 创建命令表

  2. 载入配置选项

  3. 初始化服务器数据结构, 如clients链表, db数组, lua环境等等

  4. 还原数据库状态(载入AOF文件或RDB文件)

  5. 执行事件循环

  • Title: 第14章 服务器
  • Author: Huan Lee
  • Created at : 2023-08-27 17:40:10
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/27/notion-第14章 服务器-b0fd0b68/
  • License: This work is licensed under CC BY-NC-SA 4.0.